4325

22 分钟

#Python 的文件 I/O

文件读写是最基本的 IO 操作。Python 通过内建函数 open 打开文件,然后返回一个文件 I/O 流的对象。 该对象支持以下常用方法:

方法说明
close关闭文件 I/O 流
read读取
write写入
tell获取当前偏移量
seek设置偏移量

示例:

f = open('./1.txt', 'w', encoding='utf-8') # w 表示以只写模式打开文件,encoding 表示文件的编码 f.write('测试') # 写入字符串 f.close() # 关闭 f = open('./1.txt', 'r', encoding='utf-8') # r 表示以只读模式打开文件,encoding 表示文件的编码 text = f.read() # 读取内容 print(text) # 查看读取到的内容 f.close() # 关闭

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#文件的打开模式

  • r 表示读,如果文件不存在则会报错
  • w 表示写,如果文件已经存在则会清空原文件
  • a 表示追加,打开文件时偏移量在文件末尾
  • + 表示读写
  • b 表示二进制模式,常用于非文本文件,例如图片、可执行文件等
模式说明文件存在文件不存在初始偏移返回值类型
r只读打开文件报错 FileNotFoundError文件开头str
w只写清空文件新建文件文件开头str
a追加写打开文件新建文件文件末尾str
r+读写打开文件新建文件文件开头str
w+读写清空文件新建文件文件开头str
a+追加读写打开文件新建文件文件末尾str
rb只读打开文件报错 FileNotFoundError文件开头byets
wb只写清空文件新建文件文件开头byets
ab追加写打开文件新建文件文件末尾byets
rb+读写打开文件报错 FileNotFoundError文件开头byets
wb+读写清空文件新建文件文件开头byets
ab+追加读写打开文件新建文件文件末尾byets

采用文本模式打开文件时,需要进行编解码。如果不传递 encoding 参数,则使用操作系统指定的编码,在中文 Windows 上默认为 GBK。建议使用现行的主流编码 UTF-8,以避免各种兼容性问题。

#文件的偏移量

文件偏移量标记当前操作文件的位置,在 Python 中使用 tell 方法获取偏移量,seek 方法修改偏移量,在进行读写操作时,偏移量会自动增加。

  • 对于文本文件,偏移量的单位是 字符
  • 对于二进制文件(使用 b 模式打开),偏移量的单位是 字节
import io # 导入 io 模块 f = open('./1.txt', 'w') print('打开文件时偏移量为', f.tell()) # 查看偏移量 f.write('ABCDEFGHIJKLMNOPQRSTUVWXYZ') # 写入内容 print('写入文件后偏移量为', f.tell()) # 查看偏移量 f.close() f = open('./1.txt', 'rb') print('打开文件时偏移量为', f.tell()) # 查看偏移量 f.seek(10, io.SEEK_SET) # 将偏移量设为,文件开头 + 10 字节 print('当前偏移量为', f.tell()) f.seek(-9, io.SEEK_END) # 将偏移量设为,文件开头 - 9 字节 print('当前偏移量为', f.tell()) f.seek(-5, io.SEEK_CUR) # 将偏移量设为,当前位置 - 5 字节 print('当前偏移量为', f.tell())

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

在文件的中间进行写入时,不是插入,而是覆盖:

import io # 导入 io 模块 f = open('./1.txt', 'w') f.write('ABCDEFGHIJKLMNOPQRSTUVWXYZ') # 写入内容 f.seek(10, io.SEEK_SET) # 将偏移量设为,文件开头 + 10 字节 f.write('XXXXXXXX') # 在中间写入,会进行覆盖 f.close() f = open('./1.txt', 'r') print(f.read())

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#with

每次都手动关闭文件略显繁琐,并且过程中如果发生了错误,可能导致忘记关闭。在 Python 中可以使用 with 解决这个问题:

with open('/path/to/file', 'r') as f: pass

with 的代码块运行结束时,自动调用 f.__exit__() 来关闭文件,无论是正常结束,还是异常中断。

任何有 __enter____exit__ 方法的对象均可以使用 with 语句。
在进入 with 时自动调用对象的 __enter__ 方法,在离开 with 时自动调用对象的 __exit__ 方法。

示例:

class Refrigerator: def __enter__(self): print('打开冰箱') def __exit__(self, type, value, traceback): print('关闭冰箱') refrigerator = Refrigerator() with refrigerator: pass

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

#for

文件 I/O 流是一个 可迭代对象,迭代时的每次返回一行。

下面这个示例会逐行打印自身:

with open(__file__, 'r') as fp: # __line__ 是一个特殊的内置变量,表示当前 Python 文件自身的路径 for line in fp: print(line)

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

创建于 2025/6/9

更新于 2025/6/11